package datos;

import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import conexion.Conexion;

public class AccionesProducto {
	

	public static List<Producto> getAll(){
		List<Producto>productos = new ArrayList<Producto>();
		 
		
		try {
			Statement s = Conexion.conectar().createStatement();
			ResultSet rs = s.executeQuery("SELECT * FROM producto");
			
			while(rs.next()){
				String idProducto = rs.getString("idProducto");
				String nombre = rs.getString("nombreProducto");
				double costo = rs.getDouble("costo");
				double precio = rs.getDouble("precio");
				int cantidad = rs.getInt("cantidad");
				int puntoCritico = rs.getInt("ptoCritico");
				
				String idProductoAlt=rs.getString("idProductoAlt");
				//System.out.println(idMarca);
				//System.out.println(idProveedor);
				Linea linea = AccionesLinea.getLineaById(rs.getInt("idLinea"));
				Marca marca = AccionesMarca.getMarcaById(rs.getInt("idMarca"));
				Proveedor proveedor = AccionesProveedor.getOne(rs.getInt("idProveedor"));
				
				
				Producto tmp = new Producto(idProducto, nombre, linea, marca, proveedor, costo, precio, cantidad, puntoCritico, idProductoAlt);
				productos.add(tmp);
			}
			
			s.close();
			Conexion.desconectar();
			return productos;
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
		return productos;
	}
	
	public static ArrayList<Producto> getAllById(String idProducto){
		ArrayList<Producto> productos=new ArrayList<Producto>();
		try{
			Statement stm=Conexion.conectar().createStatement();
			//ResultSet rs=stm.executeQuery("select * from producto where idProducto='"+idProducto+"'");
			ResultSet rs=stm.executeQuery("select * from producto where idProducto like '%"+idProducto+"%'");
			while(rs.next()){
				
				Proveedor proveedor = AccionesProveedor.getOne(rs.getInt("idProveedor"));
				Marca marca = AccionesMarca.getMarcaById(rs.getInt("idMarca"));
				Linea linea = AccionesLinea.getLineaById(rs.getInt("idLinea"));
				Producto p=new Producto (rs.getString("idProducto"),rs.getString("nombreProducto"),linea, marca, proveedor, rs.getDouble("costo"), rs.getDouble("precio"), rs.getInt("cantidad"), rs.getInt("ptoCritico"), rs.getString("idProductoAlt"));
				productos.add(p);
			}
			stm.close();
			Conexion.desconectar();
			return productos;
		}catch(Exception e){
			e.printStackTrace();
		}
		return productos;
	}
	
	public static ArrayList<Producto> getAllByMarca(String nombreMarca){
		ArrayList<Producto> productos=new ArrayList<Producto>();
		//Marca m=AccionesMarca.getMarcaByNombre(nombreMarca);
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select * from producto join marca on producto.idMarca=marca.idMarca where marca.nombreMarca like '%"+nombreMarca+"%'");
			//ResultSet rs=stm.executeQuery("select * from producto where idMarca like '%"+m.getIdMarca()+"%'");
			while(rs.next()){
				
				Proveedor proveedor = AccionesProveedor.getOne(rs.getInt("idProveedor"));
				Marca marca = AccionesMarca.getMarcaById(rs.getInt("idMarca"));
				Linea linea = AccionesLinea.getLineaById(rs.getInt("idLinea"));
				Producto p=new Producto (rs.getString("idProducto"),rs.getString("nombreProducto"),linea, marca, proveedor, rs.getDouble("costo"), rs.getDouble("precio"), rs.getInt("cantidad"), rs.getInt("ptoCritico"), rs.getString("idProductoAlt"));
				productos.add(p);
			}
			stm.close();
			Conexion.desconectar();
			return productos;
		}catch(Exception e){
			e.printStackTrace();
		}
		return productos;
	}
	
	public static ArrayList<Producto> getAllByLinea(String nombreLinea){
		ArrayList<Producto> productos=new ArrayList<Producto>();
		//System.out.println("llego "+nombreLinea);
		//int idLinea=AccionesLinea.getLineaByNombre(nombreLinea);
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select * from producto join linea on producto.idLinea=linea.idLinea where linea.nombreLinea like '%"+nombreLinea+"%'");
			//System.out.println("llego2 "+idLinea);
			while(rs.next()){
				
				Proveedor proveedor = AccionesProveedor.getOne(rs.getInt("idProveedor"));
				Marca marca = AccionesMarca.getMarcaById(rs.getInt("idMarca"));
				Linea linea = AccionesLinea.getLineaById(rs.getInt("idLinea"));
				Producto p=new Producto (rs.getString("idProducto"),rs.getString("nombreProducto"),linea, marca, proveedor, rs.getDouble("costo"), rs.getDouble("precio"), rs.getInt("cantidad"), rs.getInt("ptoCritico"), rs.getString("idProductoAlt"));
				productos.add(p);
			}
			stm.close();
			Conexion.desconectar();
			return productos;
		}catch(Exception e){
			e.printStackTrace();
		}
		return productos;
	}
	
	public static ArrayList<Producto> getAllByProveedor(String nombreProveedor){
		ArrayList<Producto> productos=new ArrayList<Producto>();
		//Proveedor pro=AccionesProveedor.getProveedorByNombre(nombreProveedor);
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select * from producto join proveedor on producto.idProveedor=proveedor.idProveedor where proveedor.nombreProveedor like '%"+nombreProveedor+"%'");
			while(rs.next()){
				
				Proveedor proveedor = AccionesProveedor.getOne(rs.getInt("idProveedor"));
				Marca marca = AccionesMarca.getMarcaById(rs.getInt("idMarca"));
				Linea linea = AccionesLinea.getLineaById(rs.getInt("idLinea"));
				Producto p=new Producto (rs.getString("idProducto"),rs.getString("nombreProducto"),linea, marca, proveedor, rs.getDouble("costo"), rs.getDouble("precio"), rs.getInt("cantidad"), rs.getInt("ptoCritico"), rs.getString("idProductoAlt"));
				productos.add(p);
			}
			stm.close();
			Conexion.desconectar();
			return productos;
		}catch(Exception e){
			e.printStackTrace();
		}
		return productos;
	}
	
	public static ArrayList<Producto> getAllByCategoria(String nombreCategoria){
		ArrayList<Producto> productos=new ArrayList<Producto>();
		//Categoria c=AccionesCategoria.getCategoriaByNombre(nombreCategoria);
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select * from producto join linea on producto.idLinea=linea.idLinea join categoria on categoria.idCategoria=linea.idCategoria where categoria.nombreCategoria like '%"+nombreCategoria+"%'");
			while(rs.next()){
				
				Proveedor proveedor = AccionesProveedor.getOne(rs.getInt("idProveedor"));
				Marca marca = AccionesMarca.getMarcaById(rs.getInt("idMarca"));
				Linea linea = AccionesLinea.getLineaById(rs.getInt("idLinea"));
				Producto p=new Producto (rs.getString("idProducto"),rs.getString("nombreProducto"),linea, marca, proveedor, rs.getDouble("costo"), rs.getDouble("precio"), rs.getInt("cantidad"), rs.getInt("ptoCritico"), rs.getString("idProductoAlt"));
				productos.add(p);
			}
			stm.close();
			Conexion.desconectar();
			return productos;
		}catch(Exception e){
			e.printStackTrace();
		}
		return productos;
	}
	
	public static Producto getOneById(String idProducto){
		Producto p=null;
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select * from producto where idProducto='"+idProducto+"'");
			while(rs.next()){
				Proveedor proveedor = AccionesProveedor.getOne(rs.getInt("idProveedor"));
				Marca marca = AccionesMarca.getMarcaById(rs.getInt("idMarca"));
				Linea linea = AccionesLinea.getLineaById(rs.getInt("idLinea"));
				p= new Producto (rs.getString("idProducto"),rs.getString("nombreProducto"),linea, marca, proveedor, rs.getDouble("costo"), rs.getDouble("precio"), rs.getInt("cantidad"), rs.getInt("ptoCritico"), rs.getString("idProductoAlt"));
			}
			return p;
		}catch(Exception e){
			e.printStackTrace();
		}
		return p;
	}
	
	public static boolean existsProveedorProducto(int idProveedor){
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select * from producto where idProveedor="+idProveedor);
			if(rs.next()){
				return true;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
	
	public static void updateProductoCompra(Producto p){
		String idProducto=p.getIdProducto();
		int cantidadCompra=p.getCantidad();
		int cantidadEx=0;
		double costo=p.getCosto();
		double precio=p.getPrecio();
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select * from producto where idProducto='"+idProducto+"'");
			while(rs.next()){
			cantidadEx=rs.getInt("cantidad");
			}
			int cantidadFinal=cantidadEx+cantidadCompra;
			stm.executeUpdate("update producto set cantidad="+cantidadFinal+", costo="+costo+", precio="+precio+" where idProducto='"+idProducto+"'");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public static void updateProductoVenta(Producto p){
		String idProducto=p.getIdProducto();
		int cantidadVenta=p.getCantidad();
		int cantidadEx=0;
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select * from producto where idProducto='"+idProducto+"'");
			while(rs.next()){
			cantidadEx=rs.getInt("cantidad");
			}
			int cantidadFinal=cantidadEx-cantidadVenta;
			stm.executeUpdate("update producto set cantidad="+cantidadFinal+" where idProducto='"+idProducto+"'");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	public static String getUltimoIdProducto(String idProducto){
		String idProd2=null;
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select max(cast(substring(idProducto from 7) as unsigned)) from producto where idProducto like '%"+idProducto+"%'");
			while(rs.next()){
				idProd2=rs.getString("max(cast(substring(idProducto from 7) as unsigned))");
			}
			
		}catch(Exception e){
			e.printStackTrace();
		}
		return idProd2;
	}
	
	public static void addProducto(Producto p){
		try{
			String idProducto=p.getIdProducto();
			String nombre=p.getNombre();
			int idLinea=p.getLinea().getIdLinea();
			int idMarca=p.getmarca().getIdMarca();
			int idProveedor=p.getprovedor().getIdProveedor();
			double costo=p.getCosto();
			double precio=p.getPrecio();
			int cantidad=p.getCantidad();
			int ptoCritico=p.getPuntoCritico();
			String idAlt=p.getIdProductoAlternativo();
			Statement stm=Conexion.conectar().createStatement();
			stm.executeUpdate("insert into producto values ('"+idProducto+"','"+nombre+"',"+idLinea+","+idMarca+","+idProveedor+","+costo+","+precio+","+cantidad+","+ptoCritico+",'"+idAlt+"')");
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	
	public static boolean costoEsIgual(String idProducto, double costo){
		double costoAnt=0;
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select costo from producto where idProducto='"+idProducto+"'");
			while(rs.next()){
				costoAnt=rs.getDouble("costo");
			}
			if(costo==costoAnt){
				return true;
			}else{
				return false;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
	
	public static boolean precioEsIgual(String idProducto, double precio){
		double precioAnt=0;
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select precio from producto where idProducto='"+idProducto+"'");
			while(rs.next()){
				precioAnt=rs.getDouble("precio");
			}
			if(precio==precioAnt){
				return true;
			}else{
				return false;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
	
	public static boolean existIdProducto(String idProducto){
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select * from producto where idProducto='"+idProducto+"'");
			if(rs.next()){
				return true;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	return false;
	}
	
	public static boolean stockProductoMenor(String idProducto, int cantidad){
		try{
			int cantidadEx=0;
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select cantidad from producto where idProducto='"+idProducto+"'");
			while(rs.next()){
				cantidadEx=rs.getInt("cantidad");
			}
			if (cantidadEx>=cantidad){
				return true;
			}else{
				return false;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return false;
	}
	
	public static ArrayList<Producto> getAllByLineaWithId(int idLinea){
		ArrayList<Producto> productos=new ArrayList<Producto>();
		//System.out.println("llego "+nombreLinea);
		//int idLinea=AccionesLinea.getLineaByNombre(nombreLinea);
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select * from producto where idLinea="+idLinea);
			//System.out.println("llego2 "+idLinea);
			while(rs.next()){
				
				Proveedor proveedor = AccionesProveedor.getOne(rs.getInt("idProveedor"));
				Marca marca = AccionesMarca.getMarcaById(rs.getInt("idMarca"));
				Linea linea = AccionesLinea.getLineaById(rs.getInt("idLinea"));
				Producto p=new Producto (rs.getString("idProducto"),rs.getString("nombreProducto"),linea, marca, proveedor, rs.getDouble("costo"), rs.getDouble("precio"), rs.getInt("cantidad"), rs.getInt("ptoCritico"), rs.getString("idProductoAlt"));
				productos.add(p);
			}
			stm.close();
			Conexion.desconectar();
			return productos;
		}catch(Exception e){
			e.printStackTrace();
		}
		return productos;
	}
	
	public static ArrayList<String> llegoPuntoCritico(){
		ArrayList<String> array=new ArrayList<String>();
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select idProducto from producto where cantidad<=ptoCritico");
			while(rs.next()){
				array.add(rs.getString("idProducto"));
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		return array;
	}
	
	public static void updateProducto(Producto p){
		String idProducto=p.getIdProducto();
		String nombre=p.getNombre();
		int idMarca=p.getmarca().getIdMarca();
		
		
		int ptoCritico=p.getPuntoCritico();
		String idAlt=p.getIdProductoAlternativo();
		double costo=p.getCosto();
		double precio=p.getPrecio();
		try{
			Statement stm=Conexion.conectar().createStatement();
			stm.executeUpdate("update Producto set nombreProducto='"+nombre+"',idMarca="+idMarca+", ptoCritico="+ptoCritico+", idProductoAlt='"+idAlt+"', costo="+costo+", precio="+precio+" where idProducto='"+idProducto+"'");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public static boolean tieneVentas(String idProducto){
		try{
			Statement stm=Conexion.conectar().createStatement();
			ResultSet rs=stm.executeQuery("select * from detalle_venta where idProducto='"+idProducto+"'");
			if(rs.next()){
				return true;
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	return false;
	}
	
	public static void deleteOne(String idProducto){
		try{
			Statement stm=Conexion.conectar().createStatement();
			stm.executeUpdate("delete from producto where idProducto='"+idProducto+"'");
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	
	public static void updateProveedorProducto(int idProveedor, int idMarca){
		try{
			Statement stm=Conexion.conectar().createStatement();
			stm.executeUpdate("update Producto set idProveedor="+idProveedor+" where idMarca="+idMarca);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}
